#include "myStdio.h"

FILE_* fopen_(const char* path_name, const char* mode)
{
    int flags = 0;
    int defaultmode = 0666;
    if(strcmp(mode,"r") == 0) 
        flags |= O_RDONLY;
    else if (strcmp(mode,"w") == 0)
        flags |= (O_WRONLY | O_CREAT | O_TRUNC);
    else if(strcmp(mode,"a")==0)
        flags |= (O_WRONLY | O_CREAT | O_APPEND);

    int fd = 0;
    if(flags & O_RDONLY)
        fd = open(path_name, flags);
    else
        fd = open(path_name, flags, defaultmode);
    if(fd==0)
    {
        const char* err = strerror(errno);
        write(2, err, strlen(err));
        return NULL;
    }
    FILE_* fp = (FILE_*)malloc(sizeof(FILE_));
    assert(fp);

    fp->flag = SYNC_FULL;  //defult line flush_
    fp->fileno = fd;
    fp->cap = SIZE;
    fp->size = 0;
    memset(fp->buffer, 0, SIZE);

    return fp;
}


void fwrite_(const char* ptr, int num, FILE_* fp)
{
    memcpy(fp->buffer+fp->size, ptr, num);
    fp->size += num;

    if(fp->flag & SYNC_NOW)
    {
        write(fp->fileno, fp->buffer, fp->size);
        fp->size = 0;
    }
    else if(fp->flag & SYNC_FULL)
    {
        if(fp->size = fp->cap)
        {
            write(fp->fileno, fp->buffer, fp->size);
            fp->size = 0;
        }
    }
    else if(fp->flag & SYNC_LINE)
    {
        if(fp->buffer[fp->size-1] = '\n')
        {
            write(fp->fileno, fp->buffer, fp->size);
            fp->size = 0;
        }
    }
}

void flush_(FILE_* fp)
{
    if(fp->size > 0)
    {
       write(fp->fileno, fp->buffer, fp->size); 
    }
    fsync(fp->fileno);
    fp->size = 0;
}


void fclose_(FILE_* fp)
{
    flush_(fp);
    close(fp->fileno);
}




